package config

import (
	"flag"
	"github.com/ilyakaznacheev/cleanenv"
	"log"
	"os"
)

type HTTPServer struct {
	Addr string `yaml:"addr" env-required:"true"`
}

type Config struct {
	Env         string `yaml:"env" env:"ENV" env-required:"true"`
	StoragePath string `yaml:"storage_path" env-required:"true"`
	HTTPServer  `yaml:"http_server"`
}

func MustLoad() *Config {
	// 声明配置文件路径变量
	var configPath string
	// 首先尝试从环境变量 CONFIG_PATH 获取配置路径
	configPath = os.Getenv("CONFIG_PATH")
	// 如果环境变量未设置（路径为空）
	if configPath == "" {
		// 定义命令行标志 -config，用于接收配置文件路径
		flags := flag.String("config", "", "path to the configuration file")
		flag.Parse() // 解析命令行参数
		// 获取命令行传入的配置路径值
		configPath = *flags
	}

	// 检查配置路径是否设置
	if configPath == "" {
		log.Fatal("Config path is not set")
	}

	// 检查配置文件是否存在
	if _, err := os.Stat(configPath); os.IsNotExist(err) {
		// 如果配置文件不存在，记录致命错误并退出程序
		log.Fatalf("config file does not exist: %s", configPath)
	}

	var cfg Config
	// 使用 cleanenv 库读取配置文件
	err := cleanenv.ReadConfig(configPath, &cfg)

	// 检查配置文件读取是否出错
	if err != nil {
		// 如果读取失败，记录错误信息并终止程序
		log.Fatalf("can not read config file: %s", err.Error())
	}

	return &cfg
}
